home *** CD-ROM | disk | FTP | other *** search
/ Ray Dream Studio 5 / Ray Dream.iso / pc / DreamSDK / Windows / SAMPLES / EXPORTER / DXF / RGBHSV.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  1997-07-11  |  2.4 KB  |  137 lines

  1. //$Id: RgbHsv.cpp 1.1 1996/07/18 23:58:15 Damien Exp $
  2.  
  3. // Copyright (c) 1990-1995 Ray Dream, Inc. All rights reserved.
  4.  
  5.  
  6. #ifndef __RGBHSV__
  7. #include "rgbhsv.h"
  8. #endif
  9.  
  10. #include <math.h>
  11.  
  12.  
  13. void RDHSV2RGB(const RDHSVColor& hsvColor, RDRGBColor& rgbColor) {
  14.     double r=0;
  15.     double g=0;
  16.     double b=0; 
  17.     
  18.     double h = (double)hsvColor.hue/65535.0 ; //angle in degree
  19.     double s = (double)hsvColor.saturation/65535.0;
  20.     double v = (double)hsvColor.value/65535.0;
  21.  
  22.     if (s != 0) {
  23.         h *= 6;
  24.         short sextant =(short) floor(h); 
  25.         double fract = h - sextant;
  26.         double min = v*(1-s); 
  27.         double vsf = v*s*fract;
  28.         double mid1 = min + vsf;
  29.         double mid2 = v - vsf;
  30.         switch (sextant) {
  31.             case 0: { 
  32.                 r = v;
  33.                 g = mid1;
  34.                 b = min;
  35.                 break;
  36.                 }
  37.             case 1: {
  38.                 r = mid2;
  39.                 g = v;
  40.                 b = min;
  41.                 break;
  42.                 }
  43.             case 2: {
  44.                 r = min;
  45.                 g = v;
  46.                 b = mid1;
  47.                 break;
  48.                 }
  49.             case 3: {
  50.                 r = min;
  51.                 g = mid2;
  52.                 b = v;
  53.                 break;
  54.                 }
  55.             case 4: {
  56.                 r = mid1;
  57.                 g = min;
  58.                 b = v;
  59.                 break;
  60.                 }
  61.             case 5: {
  62.                 r = v;
  63.                 g = min;
  64.                 b = mid2;
  65.                 break;
  66.                 }
  67.             } // switch
  68.         }
  69.     else {
  70.         r = v;
  71.         g = v;
  72.         b = v;
  73.         }
  74.         
  75.         
  76.     rgbColor.rr = (unsigned short) (r * 65535);
  77.     rgbColor.gg = (unsigned short) (g * 65535);
  78.     rgbColor.bb = (unsigned short) (b * 65535);
  79. }                    
  80.  
  81. void RDRGB2HSV(const RDRGBColor& rgbColor, RDHSVColor& hsvColor) {
  82.     double r= (double)rgbColor.rr / 65535.0;
  83.     double g= (double)rgbColor.gg / 65535.0;
  84.     double b= (double)rgbColor.bb / 65535.0;
  85.     double max,min,delta;
  86.     double h = 0;
  87.     double s = 0;
  88.     double v = 0;
  89.     
  90.     if (r>g)     //compute max and min simultaneously
  91.         if (g>b) {
  92.             max = r;          
  93.             min = b;
  94.             }
  95.         else {
  96.             min = g;
  97.             if (r>b)
  98.                 max = r;
  99.             else
  100.                 max = b;    
  101.         }
  102.     else 
  103.         if (r>b) {
  104.             max = g;          
  105.             min = b;
  106.             }
  107.         else {
  108.             min = r;
  109.             if (g>b)
  110.                 max = g;
  111.             else
  112.                 max = b;    
  113.         }                  
  114.  
  115.     delta = max-min;
  116.  
  117.     v = max;
  118.     if (v != 0.0) {
  119.       s = delta/max; 
  120.         if (s != 0.0) {
  121.             if (max==r)  
  122.                 h = (g-b)/delta;
  123.             else if (max==g)
  124.                 h = 2.0 + (b - r)/delta;
  125.             else 
  126.                 h = 4.0 + (r -g)/delta ;         
  127.             h /= 6;
  128.             if (h<0) 
  129.                 h += 1.0; // make sure hue > 0
  130.             }  
  131.       }  
  132.       
  133.      hsvColor.hue = (unsigned short) (h * 65535);
  134.     hsvColor.saturation = (unsigned short) (s * 65535); 
  135.      hsvColor.value = (unsigned short) (v * 65535);
  136.     } 
  137.